/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Busquedas;

import Estados.*;
import Juegos.*;
import java.util.ArrayList;

/**
 *
 * @author Alvaro
 */
public class Profundidad extends Busqueda{

    ArrayList<Estado> expandidos;
    ArrayList<Estado> pilaAbiertos;


    public Profundidad(Estado ini,Juego juego){
        super(ini,juego);
        this.expandidos=new ArrayList<Estado>();
        this.pilaAbiertos=new ArrayList<Estado>();
        this.pilaAbiertos.add(ini);
    }


    public ArrayList<Estado> resolver(){
        boolean solucion = false;
        while (!solucion && this.pilaAbiertos.size()!=0){
            Estado e=this.pilaAbiertos.remove(0);
            if(juego.esFinal(e)){
                solucionar(e);
                solucion=true;
            }else{
                generaHijos(e);
            }
        }
        return this.solucion;
    }

    private void generaHijos(Estado e){
        this.expandidos.add(e);
        int ops=this.juego.getNumOperadores();
        for(int i=0;i<ops;i++){
            Estado nuevo=this.juego.operar(i,e);
            //control de ciclos y de estado peligro
            if( nuevo!=null && !estaExpandido(nuevo) && !juego.esPeligro(nuevo))
                this.pilaAbiertos.add(0, nuevo);
        }
    }

    private boolean estaExpandido(Estado e){
        for(int i=0;i<this.expandidos.size();i++){
            if(e.Iguales(e, this.expandidos.get(i)))
                return true;
        }
        return false;


    }
}
